#include "mprpcconfig.h"

#include <iostream>

// 负责解析加载配置文件
void MprpcConfig::LoadConfigFile(const char *config_file)
{
    FILE *pf = fopen(config_file, "r");
    if(pf == nullptr)
    {
        std::cout << config_file << " is not exist!" << std::endl;
        exit(EXIT_FAILURE);
    }

    // 1. 注释  2. 正确的配置型  3. 去掉开头多余的空格
    while (!feof(pf))
    {
        char buf[512] = {0};
        fgets(buf, 512, pf);

        // 去除前缀空格和后缀空格
        std::string readBuf(buf);
        Trim(readBuf);

        // 判断 # 注释
        if(readBuf[0] == '#' || readBuf.empty())
            continue;
        
        // 解析配置型
        int idx = readBuf.find('=');
        if(idx == -1)
        {
            // 配置项不合法
            continue;
        }

        std::string key = readBuf.substr(0, idx);
        Trim(key);
        int endIdx = readBuf.find('\n', idx);  // 从idx往后继续找
        std::string value = readBuf.substr(idx + 1, endIdx - idx - 1);
        Trim(value);
        
        m_configMap.insert({key, value});
    }
}

// 查询配置项信息
std::string MprpcConfig::Load(const std::string &key)
{
    auto it = m_configMap.find(key);
    if(it == m_configMap.end())
    {
        // key 不存在
        return "";
    }
    return it->second;
}

// 去掉字符串前后的空格
void MprpcConfig::Trim(std::string &srcBuf)
{
    int idx = srcBuf.find_first_not_of(' ');  // 返回第一个不是空格的下标，找不到返回 -1
    if (idx != -1)
    {
        // 字符串有前缀空格
        srcBuf = srcBuf.substr(idx, srcBuf.size() - idx);
    }
    idx = srcBuf.find_last_not_of(' ');
    if (idx != -1)
    {
        // 字符串有后缀空格
        srcBuf = srcBuf.substr(0, idx + 1);
    }
}